package org.adoxx.pn; import java.util.ArrayList; import java.util.HashMap; public class PetriNet implements java.io.Serializable{ private static final long serialVersionUID = 3426953988681102210L; public class PL implements java.io.Serializable{ private static final long serialVersionUID = 5172052386953796272L; public String name = ""; public String description = ""; public int numToken = 0; public boolean excludeFromDeadlockCheck = false; public String x="0",y="0",w="40.0",h="40.0"; public ArrayList previousList = new ArrayList(); public ArrayList nextList = new ArrayList(); public HashMap additionalInfoList = new HashMap(); public PetriNet petrinet = null; public PL(String name){ this.name = name.replaceAll("(\\W|_)+", ""); } @SuppressWarnings("unchecked") public ArrayList getPreviousList_safe(){ return (ArrayList) previousList.clone(); } @SuppressWarnings("unchecked") public ArrayList getNextList_safe(){ return (ArrayList) nextList.clone(); } public void addInfo(String name, String value){ additionalInfoList.put(name, value); } } public class TR implements java.io.Serializable{ private static final long serialVersionUID = 6525281606058042758L; public String name = ""; public String description = ""; public String x="0",y="0",w="40.0",h="40.0"; public ArrayList previousList = new ArrayList(); public ArrayList nextList = new ArrayList(); public HashMap additionalInfoList = new HashMap(); public PetriNet petrinet = null; public TR(String name){ this.name = name.replaceAll("(\\W|_)+", ""); } @SuppressWarnings("unchecked") public ArrayList getPreviousList_safe(){ return (ArrayList) previousList.clone(); } @SuppressWarnings("unchecked") public ArrayList getNextList_safe(){ return (ArrayList) nextList.clone(); } public void addInfo(String name, String value){ additionalInfoList.put(name, value); } } public class TP implements java.io.Serializable{ private static final long serialVersionUID = 5691467102614286878L; public TR source; public PL target; public int weight=1; public HashMap additionalInfoList = new HashMap(); public PetriNet petrinet = null; public TP(TR transition, PL place){ this.source = transition; this.target = place; } public void addInfo(String name, String value){ additionalInfoList.put(name, value); } } public class PT implements java.io.Serializable{ private static final long serialVersionUID = -33230958480957514L; public PL source; public TR target; public int weight=1; public HashMap additionalInfoList = new HashMap(); public PetriNet petrinet = null; public PT(PL place, TR transition){ this.source = place; this.target = transition; } public void addInfo(String name, String value){ additionalInfoList.put(name, value); } } private String name; private ArrayList placeList = new ArrayList(); private ArrayList transitionList = new ArrayList(); private ArrayList startList = new ArrayList(); private ArrayList endList = new ArrayList(); private ArrayList connectionPTList = new ArrayList(); private ArrayList connectionTPList = new ArrayList(); public PetriNet(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void resetNet(){ placeList.clear(); transitionList.clear(); startList.clear(); endList.clear(); connectionPTList.clear(); connectionTPList.clear(); } public PetriNet clonePN() throws Exception{ java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(512); java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(bos); out.writeObject(this); byte[] bytes = bos.toByteArray(); out.close(); java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(bytes)); PetriNet readObject = (PetriNet) ois.readObject(); ois.close(); return readObject; } public void importPN(PetriNet petriNet) throws Exception{ petriNet = petriNet.clonePN(); placeList.addAll(petriNet.placeList); transitionList.addAll(petriNet.transitionList); startList.addAll(petriNet.startList); endList.addAll(petriNet.endList); connectionPTList.addAll(petriNet.connectionPTList); connectionTPList.addAll(petriNet.connectionTPList); } @SuppressWarnings("unchecked") public ArrayList getPlaceList_safe(){ return (ArrayList) placeList.clone(); } public ArrayList getPlaceList(){ return placeList; } @SuppressWarnings("unchecked") public ArrayList getTransitionList_safe(){ return (ArrayList) transitionList.clone(); } public ArrayList getTransitionList(){ return transitionList; } @SuppressWarnings("unchecked") public ArrayList getStartList_safe(){ return (ArrayList) startList.clone(); } public ArrayList getStartList(){ return startList; } @SuppressWarnings("unchecked") public ArrayList getEndList_safe(){ return (ArrayList) endList.clone(); } public ArrayList getEndList(){ return endList; } @SuppressWarnings("unchecked") public ArrayList getConnectionPTList_safe(){ return (ArrayList) connectionPTList.clone(); } public ArrayList getConnectionPTList(){ return connectionPTList; } @SuppressWarnings("unchecked") public ArrayList getConnectionTPList_safe(){ return (ArrayList) connectionTPList.clone(); } public ArrayList getConnectionTPList(){ return connectionTPList; } public boolean isEmpty(){ return placeList.isEmpty() && transitionList.isEmpty(); } public PL addPlace(String name){ return addPlace(name, 0); } public PL addPlace(String name, int numToken){ if(name == null || name.isEmpty()) throw new IllegalArgumentException("ERROR: Name is empty or null"); for(PL place:placeList) if(place.name.equals(name)) throw new IllegalArgumentException("ERROR: A place with name " + name + " already exist"); PL ret = new PL(name); ret.numToken = numToken; ret.petrinet = this; placeList.add(ret); //if(numToken>0) // startList.add(ret); return ret; } public void delPlace(String name){ delPlace(getPlace(name)); } public void delPlace(PL place){ placeList.remove(place); endList.remove(place); startList.remove(place); for(TR tr0:place.getPreviousList_safe()) delConnection(tr0, place); for(TR tr0:place.getNextList_safe()) delConnection(place, tr0); } public ArrayList getEnabledTransitions(){ return getEnabledTransitions(getCurrentMark()); } //FIXME: leggere arc weight!!! public ArrayList getEnabledTransitions(int[] startingMarkList){ if(startingMarkList == null) throw new IllegalArgumentException("ERROR: starting mark can not be null"); if(startingMarkList.length != placeList.size()) throw new IllegalArgumentException("ERROR: you have to provide a mark for each place"); ArrayList enabledList = new ArrayList(); for(TR transition: transitionList){ boolean isEnabled=true; for(PL place:transition.previousList) if(startingMarkList[placeList.indexOf(place)]==0) isEnabled = false; if(isEnabled) enabledList.add(transition); } return enabledList; } //FIXME: leggere arc weight!!! public void fireTransition(TR transition){ if(!getEnabledTransitions().contains(transition)) throw new IllegalArgumentException("ERROR: transition " + transition.name + " can not be fired"); for(PL place: transition.previousList) if(place.numToken>0) place.numToken--; for(PL place: transition.nextList) if(place.numToken>=0) place.numToken++; } public int[] getCurrentMark(){ int[] mark = new int[placeList.size()]; for(int i=0; i newEndList = new ArrayList(); for(PL place:placeList) if(place.nextList.isEmpty()) newEndList.add(place); this.endList = newEndList; } private void updateStartList(){ ArrayList newStartList = new ArrayList(); for(PL place:placeList) if(place.numToken>0) newStartList.add(place); this.startList = newStartList; } public void updateStartListCheckingFlow(){ ArrayList newStartList = new ArrayList(); for(PL place:placeList) if(place.numToken>0) newStartList.add(place); else if(place.previousList.isEmpty()){ place.numToken = 1; newStartList.add(place); } this.startList = newStartList; } /* public static void main(String[] args) { try { PetriNet pn = new PetriNet("test"); PL p0 = pn.addPlace("p0", 1); TR t0 = pn.addTransition("t0"); PL p1 = pn.addPlace("p1"); TR t1 = pn.addTransition("t1"); //PL p2 = pn.addPlace("p2"); pn.connect(p0, t0); //pn.connect(p0, t1); pn.connect(t0, p1); pn.connect(p1, t1); //pn.connect(t1, p2); //pn.delTransition(t0); //pn.delPlace(p1); pn.finalizeModel(); System.out.println(PNExport.exportTo_PNML(pn)); } catch (Exception e) { e.printStackTrace(); } } */ }